package com.example.demo.arithmetic;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Description: 寻找数组中第二大的元素,冒泡排序<br/>
 *
 * @author liulonglong<br                               />;
 * @taskId <br/>
 * @Date 2019/5/14 10:25
 * @Version 1.0
 */
public class ArrayTest {

    public static Integer getSecondAsc(int[] array) {
        if (null == array || array.length < 2) {
            return null;
        }
        // 初始化
        int temp = 0;
        int len = array.length;
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                if (array[i] >= array[j]) {
                    continue;
                } else {
                    temp = array[j];
                    array[j] = array[i];
                    array[i] = temp;
                }
            }
        }
        return array[1];
    }

    /*public static void main(String[] args) {
        Integer secondAsc = getSecondAsc(new int[] { 1, 2, 100, 78 });
        System.out.println(secondAsc);
    }*/

    //有且只有一个数字不重复
    public static int getMethod_2(int[] array) {
        int len = array.length;
        int res = -1;
        if (len > 1) {
            res = array[0];
            for (int i = 1; i < len; i++) {
                res = res ^ array[i];
            }
        }
        return res;
    }

    //有多个不重复数字，找出所有不重复数字
    public static ArrayList<Integer> getMethod_3(int[] array) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (array == null || array.length < 2) {
            return res;
        }
        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < array.length; i++) {
            if (map.containsKey(array[i])) {
                map.put(array[i], map.get(array[i]) + 1);
            } else {
                map.put(array[i], 1);
            }
        }
        for (Integer key : map.keySet()) {
            if (map.get(key) == 1) {
                res.add(key);
            }
        }
        return res;
    }

    //寻找数组中第一个不重复出现的字符
    public static char findFirst(String str) {
        if (str == null || str.length() == 0) {
            return '#';
        }
        int[] hashtable = new int[256];
        int len = str.length();
        char[] arr = str.toCharArray();
        for (int i = 0; i < len; i++) {
            hashtable[arr[i]]++;
        }
        for (int i = 0; i < len; i++) {
            if (hashtable[arr[i]] == 1) {
                return arr[i];
            }
        }
        return '#';
    }

    public static void main(String[] args) {
        //不重复的数字只有一个,找到这个数
        int number = getMethod_2(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -2, 1, 1, 1 });
        System.out.println(number);
        //寻找数组中第一个不重复出现的整数
        ArrayList<Integer> number_3 = getMethod_3(new int[] { 8, 7, 5, 6, -1, -2, -3, -9, -8, -7, -5, -6, 1, 2, 3, 9, 8 });
        System.out.println(number_3.size() > 0 ? number_3.get(0) : "没有找到不重复数字");
    }

}
